package com.moli.iov.handle.alarm.biz.utils;

import com.alibaba.fastjson.JSON;
import com.moli.iov.cache.RedisUtil;
import com.moli.iov.handle.alarm.constants.Constant;
import com.moli.iov.handle.alarm.model.dto.AlarmOnLineDto;
import com.moli.iov.util.StringUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Map;

/**
 * <p>
 *  报警基础工具类
 * </p>
 *
 * @author: zql
 * @Date: 2019/2/22 11:32
 */
@Slf4j
@Component
public class BaseAlarmUtils {

    @Autowired
    private RedisUtil redisUtil;

    /**
     * 获取缓存数据
     * @param key
     * @return
     */
    public String get(String key){
        return redisUtil.get(key);
    }

    /**
     * 添加缓存
     * @param key
     * @param obj
     */
    public void set(String key, String obj){
        redisUtil.set(key, obj);
    }

    /**
     * 删除缓存
     * @param key
     */
    public void delete(String key){
        redisUtil.delete(key);
    }


    /**
     * 设置报警 或 取消报警 数量  防抖用
     * @param vin
     * @param alarmCode
     * @param num
     * @param alarmField
     */
    public void setAlarmCout(String vin,
                             int alarmCode,
                             String num,
                             String alarmField){

        redisUtil.hset(getValidKey(vin, alarmCode),
                alarmField, num);
    }

    /**
     * 报警 或 取消报警 增加 num
     * @param vin
     * @param alarmCode
     * @param num
     * @param alarmField
     * @return
     */
    public long incrtAlarm(String vin,
                           int alarmCode,
                           int num,
                           String alarmField){

        return redisUtil.hIncrt(
                getValidKey(vin, alarmCode),
                alarmField,
                num);
    }

    /**
     * 获取报警 或 取消报警 缓存数量
     * @param vin
     * @param alarmCode
     * @param alarmFiled
     * @return
     */
    public int getAlarmCount(String vin,
                             int alarmCode,
                             String alarmFiled){

        String times = redisUtil.hget(getValidKey(vin, alarmCode),
                                    alarmFiled);

        if(StringUtil.isBlank(times)){
            return 0;
        }

        return Integer.parseInt(times);
    }

    /**
     * 缓存当前报警类型的状态：true、正在报警  false、报警取消
     * @param vin
     * @param alarmCode
     * @param isAlarming
     */
    public void setAlarmCodeStatus(String vin,
                                   int alarmCode,
                                   boolean isAlarming){

        redisUtil.set(getAlarmCodeStatusKey(vin, alarmCode),
                String.valueOf(isAlarming));
    }

    /**
     * 获取缓存key
     * @param vin
     * @param alarmCode
     * @return
     */
    public String getValidKey(String vin,
                              int alarmCode){

        return Constant.VIN_COMMAND_ALARM +
                vin +
                ":" +
                alarmCode;
    }

    /**
     *  生成当 前报警状态 的缓存 key
     * @param vin
     * @param alarmCode
     * @return
     */
    public String getAlarmCodeStatusKey(String vin,
                                        int alarmCode){

        return Constant.ALARM_CODE_STATUS +
                vin +
                ":" +
                alarmCode;
    }

    /**
     * 获取 当前报警类型 状态
     * @param vin
     * @param alarmCode
     * @return
     */
    public String getAlarmCodeStatus(String vin,
                                     int alarmCode){

        return redisUtil.get(
                getAlarmCodeStatusKey(vin, alarmCode));
    }

    /**
     *  添加 离线集合
     * @param alarmOnLineDto
     */
    public void setOffLine(AlarmOnLineDto alarmOnLineDto){

        redisUtil.hset(Constant.ALARM_OFF_LINE,
                alarmOnLineDto.getVin(),
                JSON.toJSONString(alarmOnLineDto));
    }

    /**
     * 获取离线车辆集合
     * @return
     */
    public Map getOffLineMap(){

        return redisUtil.hget(Constant.ALARM_OFF_LINE);
    }

    /**
     * 离线集合 移除车辆
     * @param vin
     */
    public long deleteOffLine(String vin){

        return redisUtil.hdel(Constant.ALARM_OFF_LINE, vin);
    }
}
